class MyCalendarTwo {
    map<int, int> m;
public:
    MyCalendarTwo() {
        
    }
    
    bool book(int startTime, int endTime) {
        // 插旗法：
        // 进入一个区间的时候将该点坐标对应的值 + 1，代表插上一面进入的🚩
        // 离开时将该点坐标值 - 1，代表插上一面离开的🚩
        // 在同一个点可以同时插进入的旗或离开的旗，因为这样并不形成区间重叠
        /*
            举例子 
            [10, 15) 
            [12, 18)

            插旗子 计数
            <10, 1> 
            <12, 1>
            <15, -1>
            <18, -1>
            如果 两个区间 不相交，则连续两个 插旗计数的 和 必然等于0，一个+1，一个-1     
            如果 两个区间 相交，则连续两个插旗计数 的和 必然大于0，一个+1，一个+1
        */
        m[startTime] += 1;
        m[endTime] -= 1;

        int cur = 0;
        for(auto &cp : m)
        {
            cur += cp.second;
            if(cur > 2)
            {
                // m.erase(startTime);
                // m.erase(endTime);
                m[startTime]--;
                m[endTime]++;
                return false;
            }
        }
        return true;
    }
};

/**
 * Your MyCalendarTwo object will be instantiated and called as such:
 * MyCalendarTwo* obj = new MyCalendarTwo();
 * bool param_1 = obj->book(startTime,endTime);
 */